/**
 * 每个i都有一个前驱Ai，有一个收益Ci。
 * 当拿走i的时候，如果Ai存在，则收益为Ci，否则收益为2Ci
 * 求一个拿走的顺序使得收益最大
 * 本题的前驱关系显然是一个内向基环树，外围按顺序拿即可，只剩里面的环
 * 环上面最小的最后一个拿，因此最小的下一个最先拿
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;


int N;
vector<int> A;
vector<llt> C;
vector<vi> G;
vi D;

void proc(int start, vi & ans){
    int k = start;
    for(int i=A[start];i!=start;i=A[i])if(C[i]<C[k])k=i;
    
    for(int i=A[k];i!=k;i=A[i]) ans.push_back(i), D[i] = 0;
    D[k] = 0; ans.push_back(k);
    return;
}

void proc(){
    G.assign(N + 1, {});
    D.assign(N + 1, 0);
    for(int i=1;i<=N;++i){
        G[i].push_back(A[i]);
        ++D[A[i]];
    }
    
    vi ans; ans.reserve(N);
    queue<int> q;
    for(int i=1;i<=N;++i)if(0 == D[i])q.push(i);
    while(not q.empty()){
        int h = q.front(); q.pop();
        ans.push_back(h);

        if(0 == --D[A[h]]) q.push(A[h]);
    }

    for(int i=1;i<=N;++i){
        if(D[i]){
            proc(i, ans);
        }
    }
    for(auto i : ans) cout << i << " ";
    cout << endl;
    return;
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1; 
    cin >> nofkase;
    for(int kase=1;kase<=nofkase;++kase){
        cin >> N;
        A.assign(N + 1, 0);
        C.assign(N + 1, 0);
        for(int i=1;i<=N;++i) cin >> A[i];
        for(int i=1;i<=N;++i) cin >> C[i];
        proc();
    }
    return 0;
}